home *** CD-ROM | disk | FTP | other *** search
/ Graphics & Sound Program…ng Techniques for the Mac / Graphics and Sound Programming Techniques for the Mac.iso / M&T Graphics & Sound Examples / Metrowerks Versions / C03 Sound Recording / P02 Sound Handle / SoundHandle.c next >
Encoding:
C/C++ Source or Header  |  1995-08-05  |  2.9 KB  |  131 lines  |  [TEXT/MMCC]

  1. //____________________________________________________________
  2. //    SoundHandle.c
  3. //
  4. //    Copyright © Dan Parks Sydow, 1995
  5. //    From the book:
  6. //    "Graphics and Sound Programming Techniques for the Mac",
  7. //    M&T Books, 1995
  8.  
  9.  
  10. //____________________________________________________________
  11.  
  12. #include <Sound.h>
  13. #include <SoundInput.h>
  14.  
  15.  
  16. //____________________________________________________________
  17.  
  18. void     InitializeToolbox( void );
  19. Boolean  IsSoundInputAvailable( void );
  20. OSErr    RecordSoundToMemory( SndListHandle * );
  21. OSErr    PlaySoundSynchFromHandle( SndListHandle );
  22.  
  23.  
  24. //____________________________________________________________
  25.  
  26. #define    kHeapReserve        75 * 1024 
  27.  
  28.  
  29. //____________________________________________________________
  30.  
  31. void  main( void )
  32. {
  33.    NumVersion     theSndMgrVers;
  34.    OSErr          theError;
  35.    SndListHandle  theSound;
  36.    Boolean        soundInputPresent;   
  37.    
  38.    InitializeToolbox();
  39.  
  40.    MaxApplZone();
  41.  
  42.    theSndMgrVers = SndSoundManagerVersion();   
  43.    if ( theSndMgrVers.majorRev < 3 )
  44.       ExitToShell();
  45.  
  46.    soundInputPresent = IsSoundInputAvailable();
  47.    if ( soundInputPresent == false )
  48.       ExitToShell();
  49.  
  50.    theError = RecordSoundToMemory( &theSound );
  51.    if ( theError == userCanceledErr )
  52.       ExitToShell();
  53.       
  54.    theError = PlaySoundSynchFromHandle( theSound );   
  55.    if ( theError != noErr )
  56.       ExitToShell();
  57.       
  58.    ReleaseResource( (Handle)theSound );
  59. }
  60.  
  61.  
  62. //____________________________________________________________
  63.  
  64. OSErr  RecordSoundToMemory( SndListHandle *theSound )
  65. {
  66.    OSErr  theError;
  67.    Point  theCorner = { 50, 20 }; 
  68.    long   theTotalHeap;
  69.    long   theContigMem;
  70.    
  71.    PurgeSpace( &theTotalHeap, &theContigMem );
  72.  
  73.    *theSound = (SndListHandle)NewHandle( theContigMem - kHeapReserve );
  74.    
  75.    theError = SndRecord( nil, theCorner, siBestQuality, theSound );
  76.    
  77.    return ( theError );
  78. }
  79.  
  80.  
  81. //____________________________________________________________
  82.  
  83. OSErr  PlaySoundSynchFromHandle( SndListHandle theHandle )
  84. {
  85.    OSErr   theError;
  86.    
  87.    if ( theHandle != nil )
  88.    {
  89.       HLock( (Handle)theHandle );
  90.          theError = SndPlay( nil, theHandle, false );
  91.       HUnlock( (Handle)theHandle );
  92.  
  93.       return ( theError );
  94.    }
  95. }
  96.  
  97.  
  98. //____________________________________________________________
  99.  
  100. Boolean  IsSoundInputAvailable( void )
  101. {
  102.    OSErr    theError;
  103.    long     theResult;
  104.    Boolean  inputAvail;
  105.    
  106.    theError = Gestalt( gestaltSoundAttr, &theResult );
  107.    if ( theError != noErr )
  108.       ExitToShell();
  109.       
  110.    inputAvail = theResult & ( 1 << gestaltHasSoundInputDevice );  
  111.    if ( inputAvail > 0 )
  112.       return ( true );
  113.    else
  114.       return ( false );
  115. }
  116.  
  117.  
  118. //____________________________________________________________
  119.  
  120. void  InitializeToolbox( void )
  121. {
  122.    InitGraf( &qd.thePort );
  123.    InitFonts();
  124.    InitWindows();
  125.    InitMenus();
  126.    TEInit();
  127.    InitDialogs( 0L );
  128.    FlushEvents( everyEvent, 0 );
  129.    InitCursor();
  130. }
  131.